﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Petaframe.DataAccess
{
    /// <summary>
    /// Veritabanı tablo isimlerinde boşluk olma ihtimaline karşı, bu boşluk karakterini olduğu gibi kabul etmek için kullanılan metod.
    /// örneğin tablo adı Customer Name gibi birşey ise aradaki bu boşluk sql cümlesinde sorun çıkarır.
    /// Bu yüzden veritabanına özel karakter ne ise(köşeli parantez veya çift tırnak) ,tablo ismini
    /// o karakterin içine alırız. sqlserver için [Customer Name], oracle için "Customer Name" gibi
    /// </summary>
    internal class SqlServerEscapeSqlIdentifier:IEscapeSqlIdentifier
    {
        /// <summary>
        /// Veritabanı tablo isimlerinde boşluk olma ihtimaline karşı, bu boşluk karakterini olduğu gibi kabul etmek için kullanılan metod.
        /// örneğin tablo adı Customer Name gibi birşey ise aradaki bu boşluk sql cümlesinde sorun çıkarır.
        /// Bu yüzden veritabanına özel karakter ne ise(köşeli parantez veya çift tırnak) ,tablo ismini
        /// o karakterin içine alırız. sqlserver için [Customer Name], oracle için "Customer Name" gibi
        /// </summary>
        /// <param name="tableName">Tablo veya sütun ismi</param>  
        public string EscapeSqlIdentifier(string TableOrColumnName)
        {
            if (string.IsNullOrWhiteSpace(TableOrColumnName))
                throw new NullReferenceException("TableOrColumnName");

            StringBuilder sb = new StringBuilder();
            if (TableOrColumnName.Contains('.'))
            {
                var names = TableOrColumnName.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var item in names)
                {
                    sb.AppendFormat("[{0}].", item);
                }
            }
            else
            {
                sb.AppendFormat("[{0}]", TableOrColumnName);
            }

            return sb.ToString();
        }
    }
}
